/**
 * 三元组(a,b,c)的距离为D=|a-b|+|b-c|+|c-a|
 * 1. 当a=b=c时，D最小，为0
 * 2. 其余情况，不妨设a <= b <= c
 * 设
 * t1 为 b到a的距离
 * t2 为 c到b的距离
 * t3 为 a到c的距离
 * 可以话图看出，D就是两倍的a到c的距离，当b不在a和c之间a时，道理是一样的，等式仍然成立
 * 所以问题简化为，固定一个a，找c使|c-a|最小，此时将三个数组的元素看作是一个数组和一个长数组（两个数组合并）
 * 固定第一个数组的元素，找长数组的元素使之差的绝对值最小即可。
 * 
 * （1）基本思想
 * 使用Dmin记录已经处理过的三元组的最小距离，初始化为一个足够大的整数
 * 使用i,j,k遍历三个数组，当他们全都不到数组尾时循环执行：
 *  计算距离,i,j,k下标处元素的距离D
 *  若D<Dmin，则更新Dmin
 *  将i,j,k下标对应元素最小的哪个下标加1
 * 输出Dmin
 * 结束
 * 
 * ！！！对于当一个数组遍历的末尾，导致while循环退出，而其他数组还没有被遍历完的情况
 * 有点不理解，为什么不将所有元素全部遍历一遍，就能得出最短长度的结果
 * 注意一点：这三个数组都是已经从小到大排好序的，这一点对于理解上面很有帮助
 * 
 * 三个非空整数集合S1,S2,S3
 * 
 * 
 * （3）复杂度计算：n=|s1|+|s2|+|s3|
 * 时间复杂度为O(n)
 * 空间复杂度为O(1)
 */

//（2）实现
#include<stdbool.h>

#define INT_MAX 0x7fffffff
int abs(int a){
    if(a<0)return -a;
    else return a;
}
/**
 * 判断a是否是最小的
 */
bool xls_min(int a,int b,int c){
    if(a<=b&&a<=c)return true;
    else return false;
}

/**
 * 这个算法的时间复杂度最坏是三个数组长度的和
 * 空间复杂度O(1),即使用的都是常量个，
 * 答案给的算法，对i,j,k递增可能更有规律一些，但是本质上还是对三个数组的元素遍历，那么为什么不直接合并成两个数组呢
 * 
 * @param a 第一个数组
 * @param n 第一个数组的长度
 * @param 分别是第二个和第三个数组
 * @return int 最小距离
 */
int solution(int a[],int n,int b[],int m,int c[],int p){
    int i=0,j=0,k=0,distance_min=INT_MAX,distance;//距离的最小值和当前距离
    while (i<n&&j<m&&k<p&&distance_min>0)//最小距离等于0退出，此时解集合中最小的解（即不用再去判断其他的情况了）
    {
        distance=abs(a[i]-b[j])+abs(b[j]-c[k])+abs(c[k]-a[i]);
        if(distance<distance_min) distance_min=distance;
        //最小值在哪个数组中，就将哪个数组的下标加一
        //最小值是a，最大值是c，但是这里的a和c并不是固定属于某一个数组的
        //他们是动态变化的，所以才有了下面这种判断方式！！！好题！！！
        if(xls_min(a[i],b[j],c[k])) i++;
        else if (xls_min(b[j],a[i],c[k])) j++;
        else k++;
    }
    
}


/**
 * 下面按照自己的理解对上面重新实现
 * 参数不变，仍然是数组和他们的长度
 * 此时时间复杂度变成了n*(m+p)->n^2，这样不行！！！
 */
int solution(int a[],int n,int b[],int m,int c[],int p){
    int i=0,j=0,k=0,distance_min=INT_MAX,distance;//距离的最小值和当前距离
    for(int i=0;i<n;i++){//对a元素遍历
        //对于每个a元素，遍历b+c数组
        while(){

        }
    }
    
}


